草庐IT

C++ union 与 reinterpret_cast

全部标签

c++ - 引用使用 Union

在工作中,我一直在使用linux和适用于C++11和C++14的GCC编译器。在一些工作代码中,我使用union来存储引用和指针,如下所示:(简化为仅重要部分)structMyStruct{//Stuffunion{double&x;double*x_ptr;};MyStruct(double&value):x(value){}//Morestuff};我相信这段代码清晰、可读、明确,并且提供了一种方便的方式来存储可以转移到其他内容的引用。它提供了易于理解的语法糖,在提高可读性的同时不影响性能。然而,当我尝试在visualstudio15中使用这样的代码时,由于“double&类型的非

c++ - 用户定义类型的 static_cast

这可能吗?为什么要这么做?classFoo;classBar;......Foofoo;Barbar=static_cast(foo);通常static_cast用于数字类型和指针,但它可以用于用户定义的数据类型,也就是类吗? 最佳答案 Barbar=static_cast(foo);此转换将失败。Foo和Bar是不兼容的类型,除非至少满足以下条件之一:Foo派生自Bar,或者Bar有一个接受Foo或Or的构造函数Foo具有到Bar的用户定义转换。这里更大的问题不是它是否会成功转换。更大和实际的问题应该是:你想从这样的Actor阵容

c++ - 我可以举一个现实生活中的例子,其中通过 void* 进行强制转换而 reinterpret_cast 无效吗?

有一组关于交叉转换的问题(从T1*转换为不相关的T2*),例如this和this.答案通常是这样的:reinterpret_cast是实现定义的,转换为void*后跟static_cast是明确定义的。然而,我还没有看到使用reinterpret_cast时可能出错的任何真实示例。通过void*进行强制转换而reinterpret_cast无效的真实示例有哪些? 最佳答案 real-lifeexampleswherecastingthroughvoid*worksandreinterpret_castdoesn't如果我将这句话解释

c++ - SFINAE: 'static_cast<void>()' 或 ', void()'?

在任意类型上执行SFINAE时,通常需要将表达式的结果转换为void。我见过两种方法;转换为无效:(void)(expr)//orstatic_cast(expr)或者,或者,使用带有voidprvalueRHS的逗号运算符:(expr),void()据我了解,在这两种情况下,expr都会被求值(为了格式良好,在非求值上下文中)并丢弃结果(或结果类型,在非求值上下文中);在任何一种情况下,即使是病态类T也无法覆盖T::operatorvoid()或operator,(T,void)。(参见:Whyis"operatorvoid"notinvokedwithcastsyntax?、Wha

c++ - 一份拷贝如何使用 memcpy union 简单成员?

我不太确定关于memcpy和union普通成员的标准引用。考虑代码:structTest{union{void(*function_p)(void*);void(*function_p_c)(constvoid*);};Test(constTest&other){usingstd::memcpy;memcpy(&function_p,&other.function_p,sizeof(function_p));//?memcpy(&function_p_c,&other.function_p_c,sizeof(function_p_c));//??}};intmain(void){Tes

c++ - 创建许多 boost::polygons 的 union 的最快方法是什么?

我必须合并许多boost::polgons,但我的方法似乎性能不佳(>15分钟),尤其是在有大量多边形(>2000)的情况下。我将我想要合并的所有多边形插入一个多边形,然后加入多边形,请参阅我的代码:BOOST_FOREACH(polygon,multipolygon){boost::geometry::clear(tmp_union);//tmp_unionisamultipolygonboost::geometry::union_(result,poly,tmp_union);result=tmp_union;}结果可能不会包含很多多边形,因为大多数要合并的多边形都会相交。有没有什

c++ - dynamic_cast vs static_cast 无效*

在下面程序的最后两行中,static_cast和dynamic_cast表现不同。据我了解,dynamic_cast的结果始终解析为完整对象的地址。所以它以某种方式使用了RTTI。谁能解释一下编译器如何使用RTTI来区分两者。#includeusingnamespacestd;classTop{protected:intx;public:Top(intn){x=n;}virtual~Top(){}friendostream&operator(&b)(&b);cout(p)(p)可能的输出:https://ideone.com/WoX5DI281,2,3,40xbfcce60410xbf

c++ - reinterpret_cast 会导致未定义的行为吗?

我有一个类模板A其中包含一个指针容器(T*):templateclassA{public://...private:std::vectordata;};还有一堆函数,比如:voidf(constA&);voidg(constA&);通过来自A的转换调用这些函数是否可以?至A?Aa;...auto&ac=reinterpret_cast&>(a);f(ac);我很确定这段代码有未定义的行为。在现实生活中使用这种转换是否危险? 最佳答案 尽管reinterpret_cast本身可能是未指定的行为,但在完成转换后尝试访问参数是未定义的行为

c++ - 不受限制的 union 是否需要放置新的和构造函数定义?

我看到的无限制union的例子似乎总是在构建时使用新的放置。有关C++11功能的维基百科文章在union的构造函数中使用了new放置。https://en.wikipedia.org/wiki/C%2B%2B11#Unrestricted_unions#include//Requiredforplacement'new'.structPoint{Point(){}Point(intx,inty):x_(x),y_(y){}intx_,y_;};unionU{intz;doublew;Pointp;//IllegalinC++03;legalinC++11.U(){new(&p)Poin

c++ - 将_cast 重新解释为 void 是否合法*

我在看https://en.cppreference.com/w/cpp/language/reinterpret_cast我注意到它指定了我们始终可以转换为的合法类型:字节*char*unsignedchar*但是我没有在列表中看到void*。这是疏忽吗?我的用例需要reinterpret_cast,因为我正在从int**转换为void*。我最终将从void*转换回int**。 最佳答案 这些类型不受严格的别名规则约束。这并不意味着它们是您可以与reinterpret_cast一起使用的唯一类型.在将对象指针转换为另一种对象指针类